//package com.learning.db.pretreatment;
//
//import org.apache.hadoop.conf.Configuration;
//import org.apache.hadoop.conf.Configured;
//import org.apache.hadoop.fs.Path;
//import org.apache.hadoop.io.LongWritable;
//import org.apache.hadoop.io.NullWritable;
//import org.apache.hadoop.io.Text;
//import org.apache.hadoop.mapreduce.Job;
//import org.apache.hadoop.mapreduce.Mapper;
//import org.apache.hadoop.mapreduce.Reducer;
//import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
//import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
//import org.apache.hadoop.util.Tool;
//import org.apache.hadoop.util.ToolRunner;
//import org.springframework.beans.BeanUtils;
//
//import java.io.IOException;
//import java.util.ArrayList;
//
///**
// * ClassName: CalculatePretreatmentDataJob
// * Description: 预处理数据计算
// * <p>
// * Date: 2018/3/30 10:16 【需求编号】
// *
// * @author Sam Sho
// * @version V1.0.0
// */
//public class CalculatePretreatmentDataJob extends Configured implements Tool {
//
//
//    /**
//     * 计算往期数据 Mapper
//     */
//    static class CulOldMapper extends Mapper<LongWritable, Text, Text, PretreatmentDataBean> {
//
//        /**
//         * 个人编号,作为一行数据的key
//         */
//        private Text aac999 = new Text();
//
//        @Override
//        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//            // 获取每行数据的值
//            String lineValue = value.toString().trim();
//            // 进行分割
//            String[] arr = lineValue.split("\\|");
//            aac999.set(arr[0]);
//            PretreatmentDataBean dataBean = new PretreatmentDataBean();
//            dataBean.loadDate(arr);
//            dataBean.setFlag(0);
//            context.write(aac999, dataBean);
//        }
//    }
//
//    /**
//     * 计算Mapper
//     */
//    static class CulMapper extends Mapper<LongWritable, Text, Text, PretreatmentDataBean> {
//
//        /**
//         * 个人编号,作为一行数据的key
//         */
//        private Text aac999 = new Text();
//
//        @Override
//        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//            // 获取每行数据的值
//            String lineValue = value.toString().trim();
//            // 进行分割
//            String[] arr = lineValue.split("\\|");
//            aac999.set(arr[0]);
//            PretreatmentDataBean dataBean = new PretreatmentDataBean();
//            dataBean.loadDate(arr);
//            dataBean.setFlag(1);
//            context.write(aac999, dataBean);
//        }
//    }
//
//    /**
//     * 计算Reduce
//     */
//    static class CulReduce extends Reducer<Text, PretreatmentDataBean, PretreatmentDataBean, NullWritable> {
//
//        /**
//         * 自负费用
//         * rate1~2-普通参保人员支付比例
//         */
//        double[][] rate1 = {{0, 6000, 0, 800},
//                {6000, 10000, 0.3, 800},
//                {10000, 20000, 0.4, 2000}};
//
//        /**
//         * 普通人员-自负加合规费用比例
//         */
//        double[][] rate2 = {{20000, 50000, 0.5, 0},
//                {50000, 100000, 0.6, 15000},
//                {100000, 200000, 0.7, 45000},
//                {200000, Double.MAX_VALUE, 0.8, 115000}};
//
//        /**
//         * 自负费用
//         * 实时救助人员支付比例
//         */
//        double[][] rate3 = {{0.0000, 3000.0000, 0.0000, 800.0000},
//                {3000.0000, 6000.0000, 0.3500, 800.0000},
//                {6000.0000, 10000.0000, 0.3500, 1850.0000},
//                {10000.0000, 20000.0000, 0.4500, 3250.0000}};
//
//        /**
//         * 实时救助人员-自负加合规费用比例
//         */
//        double[][] rate4 = {{20000.0000, 50000.0000, 0.5500, 0.0000},
//                {50000.0000, 100000.0000, 0.6500, 16500.0000},
//                {100000.0000, 200000.0000, 0.7500, 49000.0000},
//                {200000.0000, Double.MAX_VALUE, 0.8500, 124000.0000}};
//
//        @Override
//        protected void reduce(Text key, Iterable<PretreatmentDataBean> values, Context context) throws IOException, InterruptedException {
//            ArrayList<PretreatmentDataBean> oldDatas = new ArrayList<>();
//            ArrayList<PretreatmentDataBean> thisDatas = new ArrayList<>();
//
//            // 区分往期并且合并计算需要数据
//            double sumAkc254 = 0.00;
//            double sumComplianceOwnExpense = 0.00;
//            double sumAkc254AddComplianceOwnExpense = 0.00;
//
//            for (PretreatmentDataBean value : values) {
//                PretreatmentDataBean dataBean = new PretreatmentDataBean();
//                BeanUtils.copyProperties(value, dataBean);
//                int flag = dataBean.getFlag();
//                // 先计算往期
//                if (0 == flag) {
//                    // 自负往期累计
//                    sumAkc254 += dataBean.getAkc254();
//                    // 合规自费 往期累计
//                    sumComplianceOwnExpense += dataBean.getComplianceOwnExpense();
//                    // 自负+合规自费 往期累计
//                    sumAkc254AddComplianceOwnExpense += dataBean.getAkc254AddComplianceOwnExpense();
//                    oldDatas.add(dataBean);
//                } else {
//                    thisDatas.add(dataBean);
//                }
//            }
//
//            System.out.println(key + ": " + "~~~ OLD ~~~" + oldDatas.size() + "~~~ THIS ~~~" + thisDatas.size());
//
//            // 自负-赔付
//            double akc254Compensate = 0.00;
//            // 自负和合规自费费用-赔付
//            double akc254AddCOECompensate = 0.00;
//            for (PretreatmentDataBean thisData : thisDatas) {
//
//                sumAkc254 += thisData.getAkc254();
//                sumComplianceOwnExpense += thisData.getComplianceOwnExpense();
//                sumAkc254AddComplianceOwnExpense += thisData.getAkc254AddComplianceOwnExpense();
//
//                // 自负金额-赔付计算
//                if (sumAkc254 > 20000) {
//                    akc254Compensate = 6000;
//                } else if (sumAkc254 < 6000) {
//                    akc254Compensate = 0;
//                } else {
//                    for (double[] doubles : rate1) {
//                        if (sumAkc254 > doubles[0] && sumAkc254 <= doubles[1]) {
//                            akc254Compensate = (sumAkc254 - doubles[0]) * doubles[2] + doubles[3];
//                            break;
//                        }
//                    }
//                }
//
//                // 自负+ 计算后的合规 赔付费用
//                if (sumAkc254AddComplianceOwnExpense <= 20000) {
//                    akc254AddCOECompensate = 0;
//                } else {
//                    for (double[] doubles : rate2) {
//                        if (sumAkc254AddComplianceOwnExpense > doubles[0] && sumAkc254AddComplianceOwnExpense <= doubles[1]) {
//                            akc254AddCOECompensate = (sumAkc254AddComplianceOwnExpense - doubles[0]) * doubles[2] + doubles[3];
//                            break;
//                        }
//                    }
//                }
//
//                thisData.setAkc254Compensate(akc254Compensate);
//                thisData.setAkc254Compensate(akc254AddCOECompensate);
//                thisData.setSumAkc254(sumAkc254);
//                thisData.setSumComplianceOwnExpense(sumComplianceOwnExpense);
//                thisData.setSumAkc254AddComplianceOwnExpense(sumAkc254AddComplianceOwnExpense);
//                context.write(thisData, NullWritable.get());
//
//            }
//        }
//
//    }
//
//    @Override
//    public int run(String[] args) throws Exception {
//        Configuration conf = getConf();
//        Job job = Job.getInstance(conf, CalculatePretreatmentDataJob.class.getSimpleName());
//        job.setJarByClass(CalculatePretreatmentDataJob.class);
//
//        FileInputFormat.addInputPath(job, new Path(args[0]));
//        FileOutputFormat.setOutputPath(job, new Path(args[1]));
//
//        // map settings
//        job.setMapperClass(CalculatePretreatmentDataJob.CulMapper.class);
//        job.setMapOutputKeyClass(Text.class);
//        job.setMapOutputValueClass(PretreatmentDataBean.class);
//
//        // reduce settings
//        job.setReducerClass(CalculatePretreatmentDataJob.CulReduce.class);
//        job.setOutputKeyClass(PretreatmentDataBean.class);
//        job.setOutputValueClass(NullWritable.class);
//
//        boolean res = job.waitForCompletion(true);
//
//        return res ? 0 : 1;
//    }
//
//
//    public static void main(String[] args) throws Exception {
//        Configuration configuration = new Configuration();
//        System.setProperty("HADOOP_USER_NAME", "sinosoft");
//        ToolRunner.run(configuration, new CalculatePretreatmentDataJob(), args);
//    }
//
//}
